package com.gurid.service.statistics.task;

import java.time.LocalDateTime;

public class CronGenerator {

    private static String sec = "*";
    private static String min = "*";
    private static String hou = "*";
    private static String day = "*";
    private static String mon = "*";
    private static String wee = "?";
    /**
     * <p>cron格式
     * <blockquote><pre>
     * ┌──────────── [可选] 秒 (0 - 59)
     * | ┌────────── 分钟 (0 - 59)
     * | | ┌──────── 小时 (0 - 23)
     * | | | ┌────── 天数 (1 - 31)
     * | | | | ┌──── 月份 (1 - 12) OR jan,feb,mar,apr ...
     * | | | | | ┌── 星期几 (0 - 6, 星期天 = 0) OR sun,mon ...
     * | | | | | |
     * * * * * * * 命令
     * </pre></blockquote>
     *
     * <p>符号说明：
     * <blockquote><pre>
     * 星号（*）：表示匹配任意值。例如，* 在分钟字段中表示每分钟都执行。
     * 逗号（,）：用于分隔多个值。例如，1,3,5 在小时字段中表示 1 点、3 点和 5 点执行。
     * 斜线（/）：用于指定间隔值。例如，*(斜杠)5在分钟字段中表示每 5分钟执行一次。
     * 连字符（-）：用于指定范围。例如，10-20在日期字段中表示从 10号到 20号。
     * 问号（?）：仅用于日期和星期几字段，表示不指定具体值。通常用于避免冲突。
     * </pre></blockquote>
     *
     * <p>Examples：
     * <blockquote><pre>
     * 0 0 12 * * ?：每天中午 12 点执行。
     * 0 0/5 * * * ?：每 5 分钟执行一次。
     * 0 0 8-18 ? * MON-FRI：周一至周五的 8 点到 18 点之间每小时执行一次。
     * </pre></blockquote>
     */
    //默认每秒一次
    public static String generateDefault(){
        return String.join(" ", sec, min, hou, day, mon, wee);
    }

    //从0秒开始，每隔sec执行一次
    public static String generateBySecond(int sec){
        return String.join(" ", "0/"+sec, min, hou, day, mon, wee);
    }

    //从当前分钟开始，每隔min执行一次
    public static String generateByMinute(int min){
        String minuteStart = String.valueOf(LocalDateTime.now().getMinute());
        return String.join(" ", "0", minuteStart+"/"+min, hou, day, mon, wee);
    }

    //从当前小时开始，每隔hou执行一次
    public static String generateByHour(int hou){
        String hourStart = String.valueOf(LocalDateTime.now().getHour());
        return String.join(" ", "0", "0", hourStart+"/"+hou, day, mon, wee);
    }

    //从当前日1:01开始，每隔day日执行一次
    public static String generateByDay(int day){
        String dayStart = String.valueOf(LocalDateTime.now().getDayOfMonth());
        return String.join(" ", "0", "1", "1", dayStart+"/"+ day, mon, wee);
    }

    //从当前日开始，每隔mon月执行一次
    public static String generateByMonth(int mon){
        String dayOfMonth = String.valueOf(LocalDateTime.now().getDayOfMonth());
        return String.join(" ", "0", "0", "0", "0", dayOfMonth+"/"+mon, wee);
    }

    //从当前日开始，每周wee执行一次
    public static String generateByWeek(int wee){
        return String.join(" ", "0", "0", "0", "0", "0", wee+"-"+wee);
    }
}
